<?php

/**
 * 获取数组中的值，如果不存在则返回 $default
 * @param $arr
 * @param $key
 * @param string $default
 * @return mixed|string
 */
function array_value($arr, $key, $default = '')
{
    return isset($arr[$key]) ? $arr[$key] : $default;
}

/**
 * 移除数组或关联数组中值为空(0,"",'',null)的项。该数组会转换为关联数组
 * @param $arr array 数组或关联数组
 * @return mixed
 */
function array_filter_empty($arr)
{
    foreach ($arr as $k => $v) {
        if (empty($v)) unset($arr[$k]);
    }
    return $arr;
}

/**
 * 数组值中对  单引号（'）  双引号（"） 反斜杠（\）  NULL 增加反斜杠
 * @param $var
 * @return string|array
 */
function array_addslashes(&$var)
{
    if (is_array($var)) {
        foreach ($var as $k => &$v) {
            array_addslashes($v);
        }
    } else {
        $var = addslashes($var);
    }
    return $var;
}

/**
 * 删除数组值中的反斜杠转义
 * @param $var
 * @return string|array
 */
function array_stripslashes(&$var)
{
    if (is_array($var)) {
        foreach ($var as $k => &$v) {
            array_stripslashes($v);
        }
    } else {
        $var = stripslashes($var);
    }
    return $var;
}

/**
 * 将数组值中的& " < > 符号转为html可显示的实体转义字符
 * @param $var
 * @return string|string[]
 */
function array_htmlspecialchars(&$var)
{
    if (is_array($var)) {
        foreach ($var as $k => &$v) {
            array_htmlspecialchars($v);
        }
    } else {
        $var = str_replace(array('&', '"', '<', '>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $var);
    }
    return $var;
}

/**
 * 移除数组值中前后的空白字符
 * @param $var
 * @return string
 */
function array_trim(&$var)
{
    if (is_array($var)) {
        foreach ($var as $k => &$v) {
            array_trim($v);
        }
    } else {
        $var = trim($var);
    }
    return $var;
}

/**
 * 去除关联数组中不同的值
 * @param $arr1
 * @param $arr2
 * @return mixed 返回只包含不同值的数组
 */
function array_diff_value($arr1, $arr2)
{
    foreach ($arr1 as $k => $v) {
        if (isset($arr2[$k]) && $arr2[$k] == $v) unset($arr1[$k]);
    }
    return $arr1;
}


/**
 * 高效取出两个数组的差集 ,比原生的array_diff快N倍
 * warning: 函数体内 $array_2 会被键值对调，如果有重复的元素将不能使用这个函数
 * @param $array_1
 * @param $array_2
 * @return mixed
 */
function array_diff_fast($array_1, $array_2)
{
    $array_2 = array_flip($array_2);
    foreach ($array_1 as $key => $item) {
        if (isset($array_2[$item])) {
            unset($array_1[$key]);
        }
    }

    return $array_1;
}

/**
 * 取出关联数组的值作为数组返回
 * @param $array
 * @return array
 */
function array_get_values($array)
{
    $arr = array();
    foreach ($array as $key => $v) {
        $arr[] = $v;
    }
    return $arr;
}


/**
 * 一维数组根据$parent_id的值转为多维数组
 * @param array $data 待处理的一维数组
 * @param string $idStr 主键字段名
 * @param string $fidStr 上级主键字段名
 * @param string $childStr 数组中存放下级的字段名
 * @param int $fid 上级主键
 * @return array $new_data 返回处理好的（多层级）多维数组
 */
function array_tree(&$data, $idStr = 'id', $fidStr = 'fid', $childStr = 'clist', $fid = 0)
{
    $result = array();
    foreach ($data as $v) {
        if ($fid === '' || $v[$fidStr] == '') continue;
        if ($v[$fidStr] == $fid) {
            $v[$childStr] = array_tree($data, $idStr, $fidStr, $childStr, $v[$idStr]);
            $result[] = $v;
        }
    }
    return $result;
}